For guards, interceptors, and pipes the execution order is global → controller → method. For exception filters the resolution order inverts: method → controller → global. The first filter whose @Catch() type matches the thrown exception handles it.
Guards — global → controller → method. All must return true for the request to proceed.
Interceptors — global → controller → method (pre). Reverse on the way out (post).
Pipes — global → controller → method. Each pipe runs on its bound parameter.
Exception filters — method → controller → global. First matching @Catch() type wins.
The filter reversal is the most commonly confused rule — remember: most specific filter wins.